#include <cstdio>
#include <cstring>
#include <memory>
// #include "freertos/FreeRTOS.h"
// #include "freertos/task.h"
#include "driver/gpio.h"
#include "sd_card.h"
#include "wav_recoder.h"
#include "audio_es7210.h"
#include "app.h"


// LED app
// extern "C" void app_main(void)
// {
//     std::printf("Hello world!\n");
//     gpio_config_t io_conf;
//     io_conf.intr_type = GPIO_INTR_DISABLE;
//     io_conf.mode = GPIO_MODE_OUTPUT;
//     io_conf.pin_bit_mask = (1ULL<<GPIO_NUM_10);
//     // 接地是下拉电阻，接电是上拉电阻
//     // 如果一个引脚需要读取数据，如果其处于悬空状态，那么需要加上下拉电阻来抗干扰
//     io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
//     io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
//     gpio_config(&io_conf);
//     gpio_set_level(GPIO_NUM_10, 1);
// }

// sdcard app
// char buffer[50];
// extern "C" void app_main(void)
// {
//     auto sdFile = std::make_shared<SdCard>();
//     ESP_ERROR_CHECK(sdFile->open("test.txt", "w+"));
//     sdFile->write_file("hello world", strlen("hello world"));
//     sdFile->read_file(buffer, sizeof(buffer));
//     std::printf("read file: %s\n", buffer);
//     sdFile->close();
// }
// main.cpp

// 音频输入转储文件存入sdcard 
// extern "C" void app_main() {
//     auto sdFile = std::make_shared<SdCard>();
//     ESP_ERROR_CHECK(sdFile->open("AAA.wav","w+"));
//     auto audio = std::make_shared<AudioEs7210>(16000,2);
//     // // 通过构造函数注入依赖
//     WavRecoder recorder(sdFile, audio);
    
//     // 开始录音
//     recorder.record(10);

//     sdFile->close();
// }


// RTOS 打印系统信息
// void print_all_tasks() {
//     char task_list_buffer[1024]; // 缓冲区大小建议 >= 512 字节
//     vTaskList(task_list_buffer); // 获取任务信息
//     printf("Task List:\n%s\n", task_list_buffer);
// } 

// extern "C" void app_main(void)
// {  
//     while (true)
//     {
//         vTaskDelay(pdMS_TO_TICKS(1000));    
//         // print_all_tasks();
//         // 获取当前任务栈剩余空间（栈的高水位）
//         TaskHandle_t main_task = xTaskGetCurrentTaskHandle();
//         UBaseType_t stack_remaining = uxTaskGetStackHighWaterMark(main_task); 
//         // vTaskResume(xTaskGetHandle("ipc0"));
//         std::printf("app_main 栈剩余空间: %u 字节 \n",  
//                stack_remaining * sizeof(StackType_t));  
//     }
// }


// RTOS 任务调用
extern "C" void app_main(void)
{
    App::GetInstance().run();
}